package com.nowcoder.community.util;

/**
 * @author AnYang
 * @Description redis的key
 * @Version 1.0.0
 * @Date 2024/1/28
 */
public class RedisKeyUtil {

    // 用于key的分割
    private static final String SPLIT = ":";

    // key的前缀
    private static final String PREFIX_ENTITY_LIKE = "like:entity";

    // 某个用户获得的赞
    private static final String PREFIX_USER_LIKE = "like:user";

    // 关注目标
    private static final String PREFIX_FOLLOWEE = "followee";
    // 关注者自己
    private static final String PREFIX_FOLLOWER = "follower";

    // 存验证码
    private static final String PREFIX_KAPTCHA = "kaptcha";

    // 存入登录凭证
    private static final String PREFIX_TICKET = "ticket";

    // 存入缓存的user数据
    private static final String PREFIX_USER = "user";

    // 统计访客数量
    private static String PREFIX_UV = "uv";

    // 统计日活用户数量
    private static String PREFIX_DAU = "dau";

    // 热度变化的帖子
    private static String PREFIX_POST = "post";


    // 某个实体的赞
    // entityType:实体类型 entityId:实体id, value用set可以查看谁给我点赞，并且可以通过set统计数量，即点赞数
    // like:entity:entityType:entityId -> value: set(userId)
    public static String getEntityLikeKey(int entityType, int entityId) {
        return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
    }

    // 某个用户的赞
    // like:user:userId -> int
    public static String getUserLikeKey(int userId) {
        return PREFIX_USER_LIKE + SPLIT + userId;
    }

    // 某个用户关注的实体
    // followee:userId:entityType -> zset(entityId,now) 某人关注了某个东西（人、话题等），
    // 记录实体id，也就是关注的具体的实体，以时间排序
    public static String getFolloweeKey(int userId, int entityType) {
        return PREFIX_FOLLOWEE + SPLIT + userId + SPLIT + entityType;
    }

    // 某个用户拥有的粉丝
    // follower:entityType:entityId -> zset(userId,now) 某个实体所拥有的粉丝，记录具体的用户id，以时间排序
    public static String getFollowerKey(int entityType, int entityId) {
        return PREFIX_FOLLOWER + SPLIT + entityType + SPLIT + entityId;
    }

    // 登录验证码
    // 验证码属于某个用户，因为用户还未登录所有拿不到用户id，所以需要生成一个临时key标识某个用户，并传入到cookie中
    public static String getKaptchaKey(String owner) {
        return PREFIX_KAPTCHA + SPLIT + owner;
    }

    // 登录凭证
    // 因为是存入ticket，所以需要传进来ticket
    public static String getTicketKey(String ticket) {
        return PREFIX_TICKET + SPLIT + ticket;
    }

    // 缓存user信息
    public static String getUserKey(int userId) {
        return PREFIX_USER + SPLIT + userId;
    }

    // 单日uv
    public static String getUVKey(String date) {
        return PREFIX_UV + SPLIT + date;
    }

    // 区间uv
    public static String getUVKey(String startDate, String endDate) {
        return PREFIX_UV + SPLIT + startDate + SPLIT + endDate;
    }

    // 单日dau
    public static String getDAUKey(String date) {
        return PREFIX_DAU + SPLIT + date;
    }

    // 区间dau
    public static String getDAUKey(String startDate, String endDate) {
        return PREFIX_DAU + SPLIT + startDate + SPLIT + endDate;
    }

    // 统计帖子分数
    public static String getPostScoreKey() {
        return PREFIX_POST + SPLIT + "score";
    }

}
